
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>

void sig_alrm_hd(int signo)
{
    printf("single = %d\n", signo);
}

int main(void)
{

    char buf[1024] = {0};
    struct sigaction act, oldact;

    if (0 != sigaction(SIGALRM, NULL, &oldact))
        printf("sigaction() error\n");

    act.sa_handler = sig_alrm_hd;
    sigemptyset(&act.sa_mask);
    act.sa_flags = ~SA_RESTART;
    // act.sa_flags = SA_RESTART;

    if (0 != sigaction(SIGALRM, &act, NULL))
        printf("sigaction() error\n");

    alarm(5);

    //
    if (fgets(buf, sizeof(buf), stdin) == NULL) //为了测试，我们等到计时完毕后再输入(等在此处，不输入)
    {
        printf("NULL\n");
    }
    else
    {
        printf("1'st: %s\n", buf);
    }

    if (fgets(buf, sizeof(buf), stdin) == NULL) //正常操作
    {
        printf("NULL\n");
    }
    else
    {
        printf("2'st: %s\n", buf);
    }

    exit(0);
}
/***
    act.sa_flags = SA_RESTART;

lwh@lwh-HP-Notebook:~/ProjsGit/apue/APUE_my/10_Signals$ ./test_sigaction 
single = 14  #若不输入，会一直等在此处，因为第一个fgets被重启了，在等着我们输入
asdg
1'st: asdg

asdg
2'st: asdg

lwh@lwh-HP-Notebook:~/ProjsGit/apue/APUE_my/10_Signals$ 

因为设置了 SA_RESTART/重启，所以被打断的系统调用会被重新启动，(此处是等待我们输入)

//----------------------------------------------------------------------

    act.sa_flags = ~SA_RESTART;

lwh@lwh-HP-Notebook:~/ProjsGit/apue/APUE_my/10_Signals$ ./test_sigaction 
single = 14
NULL    # 第一个fgets被alarm(5)打断，没有重启，所以打印NULL
sfdhsdf
2'st: sfdhsdf

lwh@lwh-HP-Notebook:~/ProjsGit/apue/APUE_my/10_Signals$ 

因为取消了 SA_RESTART/重启，所以 被打断的系统调用，不会重新启动,
(此处fgets()被打断，因为关闭了重启，所以直接返回NULL，所以打印NULL)

*/